iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0
Software Development

iOS 學習筆記系列 第 18

Day18 Combine 05 - Operators 類型介紹 : 轉換操作符

  • 分享至 

  • xImage
  •  

轉換操作符

map/mapError

map操作符會執行給定的閉包,將上游發布的內容進行轉換,然後再發送給下游訂閱者,mapError則將錯誤轉換為另外一種錯誤類型

[1, 2].publisher
    .map { $0.description + "test" }
    .sink(receiveValue: { value in
        print(value)
    })

flatMap

flatMap 操作符會轉換上游發布者發送的所有的元素,然後返回一個新的或者已有的發布者。

flatMap 會將所有返回的發布者的輸出合併到一個輸出流中。我們可以通過 flatMap 操作符的 maxPublishers 參數指定返回的發布者的最大數量

class TestObservableObject: ObservableObject {
    var cancellable: AnyCancellable?
    
    struct Student: Decodable {
        let name: String
    }

    let json = """
    [{
    "name": "Ryder"
    },
    {
    "name": "Jason"
    },
    {
    "name": "Ray"
    }]
    """
    
    init() {
        let publisher = PassthroughSubject<String, Never>()
        
        cancellable = publisher
            .flatMap { value in
                Just(value.data(using: .utf8)!)
                    .decode(type: [Student].self, decoder: JSONDecoder())
                    .catch { _ in
                        Just([Student(name: "errorName")])
                    }
            }
            .sink(receiveCompletion: { _ in
                print("finished")
            }, receiveValue: { someValue in
                print(someValue)
            })
        
        publisher.send(json)
    }
}

因為flatMap閉包要求的返回值必須是一個publisher,所以在上邊的程式碼中,我們使用了Just,它把 json資料對映成陣列。

在上邊的catch中也用到了Just,目的是當發生錯誤時,返回一個預設的值,值得注意的是,catch同樣要求返回一個publsiher

scan

scan將收到的值與當前的值,按照給定的closure 進行轉換

(1...3).publisher
    .scan(3, +)
    .sink(receiveValue: { value in
        print(value)
    })
/*印出 
4
6
9
*/

上一篇
Day17 Combine 04 - Operators 主要類型
下一篇
Day19 Combine 06 - Operators 類型介紹 : 過濾操作符
系列文
iOS 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言